# _*_ coding:utf-8 _*_
# 开发团队: Mavericks
# 开发人员：Maverick·Ming
# 开发IDE： PyCharm
#   项目名：HelloWorld
#   文件名：6.11 多重继承.py
# 开发时间：2021/3/26 17:57

# 类名.__bases__，属性，可以获取所有父类（元组）

# 父类MavericksTeam
class MavericksTeam:
    def __init__(self, name):
        self._name = name

    def get_name(self):
        return self._name

    def set_name(self, name):
        self._name = name


# 子类Mavericks
class Mavericks(MavericksTeam):
    """This is a coder of the Team-Mavericks"""

    def __init__(self, name, age):
        super().__init__(name)  # super 返回父类对象，不需要self
        self._age = age

    @property
    def age(self):
        return self._age

    @age.setter
    def age(self, age):
        self._age = age


# 孙类MaverickMing
class MaverickMing(Mavericks):

    def __init__(self, name, age, gender):
        super().__init__(name, age)
        self._gender = gender

    @property
    def gender(self):
        return self._gender

    @gender.setter
    def gender(self, gender):
        self._gender = gender

    # 公有方法
    def say_hello(self, say):
        print(self._name, "向您say %s " % say)


mm = MaverickMing('小明', 18, 'male')
mm.say_hello('你好')  # 结果：小明 向您say 你好
print(MaverickMing.__bases__)  # 结果(<class '__main__.Mavericks'>,)
print(MavericksTeam.__bases__)  # 结果：(<class 'object'>,)
# 单重继承父类，只有一个父类


# python中支持多重继承，也就是继承父类时，可以指定多个父类
#   多重继承，会使子类同时继承多个父类的方法
class Coder:

    def bug_creat(self):
        print('我会写bug')

    def bug_fixing(self):
        print('我会修bug')


class NormalCoder(Coder, MaverickMing):

    def learn(self):
        print('我会努力学习')


print(NormalCoder.__bases__)  # 结果：(<class '__main__.Coder'>, <class '__main__.MaverickMing'>)
nc = NormalCoder('普通学生', 18, 'male')
nc.say_hello('我虽然普通，但我会努力的!')
nc.bug_creat()
nc.bug_fixing()
nc.learn()

# 在开发过程中，没有特殊的情况，应该尽量避免使用多重继承，因为多重继承会让我们的代码过于复杂
# 有多复杂：
# 如果C类同时继承A类、B类，且两个父类同时具有两个同名的方法，则会优先调用第一个父类的方法
# 前面的父类的方法会覆盖后面的方法（之从左往右，左是前）
# 编译器找父类中的方法，是从左往右找
